﻿using System.Web.Mvc;
using zeus.Core;
using SharpArch.Web.NHibernate;
using SharpArch.Core;
using SharpArch.Core.PersistenceSupport;
using System.Collections.Generic;
using Webdiyer.WebControls.Mvc;
using System;
using System.Linq;
using zeus.Core.RepositoryInterfaces;
using zeus.Web.Controllers.Helpers;


namespace zeus.Web.Controllers
{
    [HandleError]
    public class MonitoreoController : Controller
    {

       private readonly IRepository<Cliente> clienteRepository;
        private readonly IUsuarioRepository usuarioRepository;
        private readonly IUbicacionRepository ubicacionRepository;
        private readonly IUnidadRepository unidadRepository;
        private readonly IGrupoUsuarioRepository grupoUsuarioRepository;
        private readonly IRepository<Ubicacion> ubicacionesRepository;
        private readonly IEventoRepository eventosRepository;
        
        public MonitoreoController(IRepository<Cliente> clienteRepository,
            IUsuarioRepository usuarioRepository, 
            IUbicacionRepository ubicacionRepository,
            IUnidadRepository unidadRepository,
            IGrupoUsuarioRepository grupoUsuarioRepository,
            IRepository<Ubicacion> ubicacionesRepository,
            IEventoRepository eventosRepository)
        {

            Check.Require(grupoUsuarioRepository != null, "grupoUsuarioRepository may not be null");
            this.grupoUsuarioRepository = grupoUsuarioRepository;

            Check.Require(usuarioRepository != null, "usuarioRepository may not be null");
            this.usuarioRepository = usuarioRepository;

            Check.Require(clienteRepository != null, "clienteRepository may not be null");
            this.clienteRepository = clienteRepository;

            Check.Require(ubicacionRepository != null, "ubicacionRepository may not be null");
            this.ubicacionRepository = ubicacionRepository;

            Check.Require(unidadRepository != null, "unidadRepository may not be null");
            this.unidadRepository = unidadRepository;

            Check.Require(ubicacionesRepository != null, "ubicacionesRepository may not be null");
            this.ubicacionesRepository = ubicacionesRepository;

            Check.Require(eventosRepository != null, "eventosRepository may not be null");
            this.eventosRepository = eventosRepository;
        }

        public WorkingSession workingSession
        {
            get
            {
                if (Session["WorkingSession"] == null)                
                    throw new SessionExpiredException();
                
                return Session["WorkingSession"] as WorkingSession;
            }
            set
            {
                Session["WorkingSession"] = value;
            }
        }





        public ActionResult Index()
        {
            return View();
        }


        [Transaction, Authorize]
        public ActionResult Monitoreo(int? id, int? clienteId, int? und, int? grupoId, int? ban, int? eventoId, int? ban1, int? statusEvento, int? batPri, int? accionEjecutada, int? estadoLogico)
        {
            //metodo para llenar datos de la pantalla inicial 
           // PagedList<Ubicacion> monitoreos = new PagedList<Ubicacion>(ubicacionesRepository.GetAll(), id ?? 1, 10);
            //return View(monitoreos);
          try
            {
                // Valido que la sesion se encuentre activa
                if (Session["WorkingSession"] == null)
                    throw new SessionExpiredException();

                IList<Cliente> clientes = clienteRepository.GetAll();
                ViewData["Clientes"] = new SelectList(clientes, "Id", "Nombre", clienteId);

                IList<Unidad> unidades = new List<Unidad>();
                IList<Grupo> grupos = new List<Grupo>();
                IList<Evento> eventos = new List<Evento>();

                if (usuarioRepository.IsInRole(User.Identity.Name, "admin"))
                {


                    unidades = unidadRepository.GetByCliente(clienteId ?? clientes[0].Id);
                    grupos = grupoUsuarioRepository.GetByCliente(clienteId ?? clientes[0].Id);
                    eventos = eventosRepository.GetNombreEventos();
                    ViewData["IsAdmin"] = true;
                }
                else
                {
                    unidades = unidadRepository.GetByUsuario(workingSession.Usuario.Id);
                    //grupos = grupoUsuarioRepository.GetByUsuario(workingSession.Usuario.Id);
                    grupos = grupoUsuarioRepository.GetByUsuario(workingSession.Usuario);
                    eventos = eventosRepository.GetNombreEventos();
                    ViewData["IsAdmin"] = false;
                }

                Check.Require(unidades.Count > 0, "No existen unidades asignadas");

                Dictionary<string, object> filtro = new Dictionary<string, object>();

                List<int> unidadesID = new List<int>();

                // Validar que exista la Unidad
                if (und != null && (bool)ViewData["IsAdmin"] == false && und != 0)
                {
                    unidades.ToList().ForEach(p => unidadesID.Add(p.Id));
                    Check.Require(unidadesID.Contains(und.Value), "No se puede proceder con el ID indicado");


                }


                ViewData["CodigoUnidad"] = new SelectList(unidades, "Id", "Nombre", und ?? 0);
                ViewData["Grupos"] = new SelectList(grupos, "Id", "Nombre", grupoId ?? 0);
                ViewData["EventosUnidad"] = new SelectList(eventos, "Id", "Nombre", eventoId ?? 0);
              
              /////////////////////if para verificar los conceptos////////////////////////

               if (und != null && accionEjecutada != null)
                {

                    IList<Ubicacion> ubic = ubicacionRepository.GetUbicacionesPorUnidadBateriaAlterna(und ?? unidades[0].Id, accionEjecutada ?? 1);
                    PagedList<Ubicacion> ubicaciones = new PagedList<Ubicacion>(ubic, id ?? 1, 10);
                    return View(ubicaciones);
                }

                if (grupoId != null && accionEjecutada != null)
                {

                    IList<Ubicacion> ubic = ubicacionRepository.GetUbicacionesPorGrupoBateriaAlterna(grupoId ?? grupos[0].Id, accionEjecutada ?? 1);
                    PagedList<Ubicacion> ubicaciones = new PagedList<Ubicacion>(ubic, id ?? 1, 10);
                    return View(ubicaciones);
                }

                if (und != null && batPri != null)
                {

                    IList<Ubicacion> ubic = ubicacionRepository.GetUbicacionesPorUnidadBateriaPrinciapl(und ?? unidades[0].Id, batPri ?? 1);
                    PagedList<Ubicacion> ubicaciones = new PagedList<Ubicacion>(ubic, id ?? 1, 10);
                    return View(ubicaciones);
                }

                if (grupoId != null && batPri != null)
                {

                    IList<Ubicacion> ubic = ubicacionRepository.GetUbicacionesPorGrupoBateriaPrinciapl(grupoId ?? grupos[0].Id, batPri ?? 1);
                    PagedList<Ubicacion> ubicaciones = new PagedList<Ubicacion>(ubic, id ?? 1, 10);
                    return View(ubicaciones);
                }

                if (und != null && statusEvento != null)
                {

                    IList<Ubicacion> ubic = ubicacionRepository.GetUbicacionesPorUnidadGpsValid(und ?? unidades[0].Id, statusEvento ?? 1);
                    PagedList<Ubicacion> ubicaciones = new PagedList<Ubicacion>(ubic, id ?? 1, 10);
                    return View(ubicaciones);
                }

                if (grupoId != null && statusEvento != null)
                {

                    IList<Ubicacion> ubic = ubicacionRepository.GetUbicacionesPorGrupoGpsValid(grupoId ?? grupos[0].Id, statusEvento ?? 1);
                    PagedList<Ubicacion> ubicaciones = new PagedList<Ubicacion>(ubic, id ?? 1, 10);
                    return View(ubicaciones);
                }

                if (clienteId != null && ban1 == 0 && statusEvento != null)
                {
                    IList<Ubicacion> ubic = ubicacionRepository.GetUbicacionesPorGpsPorCliente(statusEvento ?? 1, clienteId ?? clientes[0].Id);
                    PagedList<Ubicacion> ubicaciones = new PagedList<Ubicacion>(ubic, id ?? 1, 10);
                    return View(ubicaciones);
                }
                else if (clienteId == null && ban1 == 0 && statusEvento != null)
                {
                    IList<Ubicacion> ubic = ubicacionRepository.GetUbicacionesPorUsuarioGps(workingSession.Usuario.Id, statusEvento ?? 1);
                    PagedList<Ubicacion> ubicaciones = new PagedList<Ubicacion>(ubic, id ?? 1, 10);
                    return View(ubicaciones);
                }


                if (clienteId != null && ban1 == 0 && batPri != null)
                {
                    IList<Ubicacion> ubic = ubicacionRepository.GetUbicacionesPorClienteBateriaPrinciapl(clienteId ?? clientes[0].Id, batPri ?? 1);
                    PagedList<Ubicacion> ubicaciones = new PagedList<Ubicacion>(ubic, id ?? 1, 10);
                    return View(ubicaciones);
                }
                else if (clienteId == null && ban1 == 0 && batPri != null)
                {
                    IList<Ubicacion> ubic = ubicacionRepository.GetUbicacionesPorUsuarioBateriaPrinciapl(workingSession.Usuario.Id, batPri ?? 1);
                    PagedList<Ubicacion> ubicaciones = new PagedList<Ubicacion>(ubic, id ?? 1, 10);
                    return View(ubicaciones);
                }


                if (clienteId != null && ban1 == 0 && accionEjecutada != null)
                {
                    IList<Ubicacion> ubic = ubicacionRepository.GetUbicacionesPorClienteBateriaAlterna(clienteId ?? clientes[0].Id, accionEjecutada ?? 1);
                    PagedList<Ubicacion> ubicaciones = new PagedList<Ubicacion>(ubic, id ?? 1, 10);
                    return View(ubicaciones);
                }
                else if (clienteId == null && ban1 == 0 && accionEjecutada != null)
                {
                    IList<Ubicacion> ubic = ubicacionRepository.GetUbicacionesPorUsuarioBateriaAlterna(workingSession.Usuario.Id, accionEjecutada ?? 1);
                    PagedList<Ubicacion> ubicaciones = new PagedList<Ubicacion>(ubic, id ?? 1, 10);
                    return View(ubicaciones);
                }


                


              /////////////////////revisar procedures////////////////
                if (clienteId != null && ban1 == 1 && statusEvento != null)
                {
                    IList<Ubicacion> ubic = ubicacionRepository.GetUbicacionesPorGrupoClienteGps(clienteId ?? clientes[0].Id, statusEvento ?? 1);
                    PagedList<Ubicacion> ubicaciones = new PagedList<Ubicacion>(ubic, id ?? 1, 10);
                    return View(ubicaciones);
                }
                else if (clienteId == null && ban1 == 1 && statusEvento != null)
                {
                    IList<Ubicacion> ubic = ubicacionRepository.GetUbicacionesPorGrupoUsuarioGps(workingSession.Usuario.Id, statusEvento ?? 1);
                    PagedList<Ubicacion> ubicaciones = new PagedList<Ubicacion>(ubic, id ?? 1, 10);
                    return View(ubicaciones);
                }


                if (clienteId != null && ban1 == 1 && batPri != null)
                {
                    IList<Ubicacion> ubic = ubicacionRepository.GetUbicacionesPorGrupoClienteBateriaPrinciapl(clienteId ?? clientes[0].Id, batPri ?? 1);
                    PagedList<Ubicacion> ubicaciones = new PagedList<Ubicacion>(ubic, id ?? 1, 10);
                    return View(ubicaciones);
                }
                else if (clienteId == null && ban1 == 1 && batPri != null)
                {
                    IList<Ubicacion> ubic = ubicacionRepository.GetUbicacionesPorGrupoUsuarioBateriaPrinciapl(workingSession.Usuario.Id, batPri ?? 1);
                    PagedList<Ubicacion> ubicaciones = new PagedList<Ubicacion>(ubic, id ?? 1, 10);
                    return View(ubicaciones);
                }

                if (clienteId != null && ban1 == 1 && accionEjecutada != null)
                {
                    IList<Ubicacion> ubic = ubicacionRepository.GetUbicacionesPorGrupoClienteBateriaAlterna(clienteId ?? clientes[0].Id, accionEjecutada ?? 1);
                    PagedList<Ubicacion> ubicaciones = new PagedList<Ubicacion>(ubic, id ?? 1, 10);
                    return View(ubicaciones);
                }
                else if (clienteId == null && ban1 == 1 && accionEjecutada != null)
                {
                    IList<Ubicacion> ubic = ubicacionRepository.GetUbicacionesPorGrupoUsuarioBateriaAlterna(workingSession.Usuario.Id, accionEjecutada ?? 1);
                    PagedList<Ubicacion> ubicaciones = new PagedList<Ubicacion>(ubic, id ?? 1, 10);
                    return View(ubicaciones);
                }


               ////////////////////////////////////////////


                if (eventoId != null)
                {

                    if (und != null)
                    {
                        IList<Ubicacion> ubic = ubicacionRepository.GetUbicacionesPorEventoPorUnidad(eventoId ?? eventos[0].Id, und ?? unidades[0].Id);
                        PagedList<Ubicacion> ubicaciones = new PagedList<Ubicacion>(ubic, id ?? 1, 10);
                        return View(ubicaciones);
                    }

                    if (grupoId != null)
                    {
                        IList<Ubicacion> ubic = ubicacionRepository.GetUbicacionesPorEventoPorGrupo(eventoId ?? eventos[0].Id, grupoId ?? grupos[0].Id);
                        PagedList<Ubicacion> ubicaciones = new PagedList<Ubicacion>(ubic, id ?? 1, 10);
                        return View(ubicaciones);
                    }

                    if (clienteId != null && ban1 == 0)
                    {
                        IList<Ubicacion> ubic = ubicacionRepository.GetUbicacionesPorEventoPorCliente(eventoId ?? eventos[0].Id, clienteId ?? clientes[0].Id);
                        PagedList<Ubicacion> ubicaciones = new PagedList<Ubicacion>(ubic, id ?? 1, 10);
                        return View(ubicaciones);
                    }
                    else if (clienteId == null && ban1 == 0)
                    {
                        IList<Ubicacion> ubic = ubicacionRepository.GetUbicacionesPorUsuarioEvento(workingSession.Usuario.Id, eventoId ?? eventos[0].Id);
                        PagedList<Ubicacion> ubicaciones = new PagedList<Ubicacion>(ubic, id ?? 1, 10);
                        return View(ubicaciones);
                    }

                    if (clienteId != null && ban1 == 1)
                    {
                        IList<Ubicacion> ubic = ubicacionRepository.GetUbicacionesPorGrupoClienteEvento(clienteId ?? clientes[0].Id, eventoId ?? eventos[0].Id);
                        PagedList<Ubicacion> ubicaciones = new PagedList<Ubicacion>(ubic, id ?? 1, 10);
                        return View(ubicaciones);
                    }
                    else if (clienteId == null && ban1 == 1)
                    {
                        IList<Ubicacion> ubic = ubicacionRepository.GetUbicacionesPorGrupoUsuarioEvento(workingSession.Usuario.Id, eventoId ?? eventos[0].Id);
                        PagedList<Ubicacion> ubicaciones = new PagedList<Ubicacion>(ubic, id ?? 1, 10);
                        return View(ubicaciones);
                    }


                }


                if (und != null && ban1 == 2)
                {
                    IList<Ubicacion> ubic = ubicacionRepository.GetUbicaciones(und ?? unidades[0].Id);
                    PagedList<Ubicacion> ubicaciones = new PagedList<Ubicacion>(ubic, id ?? 1, 10);
                    return View(ubicaciones);
                }

                if (grupoId != null && ban1 == 2)
                {
                    IList<Ubicacion> ubic = ubicacionRepository.GetUbicacionesPorGrupo(grupoId ?? grupos[0].Id);
                    PagedList<Ubicacion> ubicaciones = new PagedList<Ubicacion>(ubic, id ?? 1, 10);
                    return View(ubicaciones);
                }


                if (grupoId != null)
                {



                    IList<Ubicacion> ubic = ubicacionRepository.GetUbicacionesPorGrupo(grupoId ?? grupos[0].Id);
                    PagedList<Ubicacion> ubicaciones = new PagedList<Ubicacion>(ubic, id ?? 1, 10);
                    return View(ubicaciones);


                }
                else
                {

                    if (ban == 0)
                    {
                        if (clienteId != null)
                        {
                            IList<Ubicacion> ubic = ubicacionRepository.GetUbicacionesPorGrupoCliente(clienteId ?? 1);
                            PagedList<Ubicacion> ubicaciones = new PagedList<Ubicacion>(ubic, id ?? 1, 10);
                            return View(ubicaciones);
                        }
                        else
                        {

                            IList<Ubicacion> ubic = ubicacionRepository.GetUbicacionesPorGrupoUsuario(workingSession.Usuario.Id);
                            PagedList<Ubicacion> ubicaciones = new PagedList<Ubicacion>(ubic, id ?? 1, 10);
                            return View(ubicaciones);

                        }

                    }
                    if (und != 0)
                    {

                        IList<Ubicacion> ubic = ubicacionRepository.GetUbicaciones(und ?? unidades[0].Id);
                        PagedList<Ubicacion> ubicaciones = new PagedList<Ubicacion>(ubic, id ?? 1, 10);
                        return View(ubicaciones);
                    }

                    else
                    {

                        if (clienteId != null)
                        {
                            IList<Ubicacion> ubic = ubicacionRepository.GetUbicacionesPorCliente(clienteId ?? 1);
                            PagedList<Ubicacion> ubicaciones = new PagedList<Ubicacion>(ubic, id ?? 1, 10);
                            return View(ubicaciones);
                        }
                        else
                        {

                            IList<Ubicacion> ubic = ubicacionRepository.GetUbicacionesPorUsuario(workingSession.Usuario.Id);
                            PagedList<Ubicacion> ubicaciones = new PagedList<Ubicacion>(ubic, id ?? 1, 10);
                            return View(ubicaciones);


                        }


                    }

                }

            }
          catch (PreconditionException ex)
          {
              TempData["ErrorMessage"] = ex.Message;
              return RedirectToAction("Error", "Shared");
          }
          catch (SessionExpiredException)
          {
              TempData["ErrorMessage"] = "Sesión Expirada!";
              TempData["Expire"] = true;
              return RedirectToAction("Error", "Shared");
          }
          catch (Exception ex)
          {
              TempData["ErrorMessage"] = ex.Message;
              return RedirectToAction("Error", "Shared");
          }
           
        }

        public ActionResult Seteo()
        {
            return View();
        }
        public ActionResult NuevoSeteo()
        {
            return View();
        }

        
        
       
           
           

        }
    }

